/*
 * Copyright (C), 2002-2017, roy 学习代码
 * FileName: SqlParserTools.java
 * Author:   roy
 * Date:     2017年1月6日 上午10:19:44
 * Description: //模块目的、功能描述      
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.roy.roycodegenerator.common.sql;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.roy.roycodegenerator.common.consts.ColumnTypeToJTypeTool;
import com.roy.roycodegenerator.service.generator.dto.ColumnDto;
import com.roy.roycodegenerator.service.generator.dto.TableDto;

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
import net.sf.jsqlparser.statement.create.table.CreateTable;

/**
 * 解析sql工具类<br>
 * 〈功能详细描述〉
 *
 * @author roy
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class SqlParserTools {
    private static final Logger logger = LoggerFactory.getLogger(SqlParserTools.class);

    /**
     * 
     * 功能描述: 解析建表语句<br>
     * 〈功能详细描述〉
     *
     * @param sql
     * @throws JSQLParserException
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static TableDto parserCreateTable(String sql) throws JSQLParserException {

        TableDto dto = new TableDto();
        CreateTable stmt = (CreateTable) CCJSqlParserUtil.parse(sql);

        logger.debug(stmt.toString());
        dto.setTableName(stmt.getTable().getName().toLowerCase());
        List<ColumnDto> columnResult = new ArrayList<ColumnDto>();

        List<ColumnDefinition> columns = stmt.getColumnDefinitions();
        List<String> commonPackage = new ArrayList<String>();
        for (ColumnDefinition c : columns) {
            logger.debug(c.getColumnName());

            ColumnDto co = new ColumnDto();
            co.setColumnType(c.getColDataType().getDataType());
            co.setColumnName(c.getColumnName().toLowerCase());
            if (null != ColumnTypeToJTypeTool.COMMON_PACKAGE_RE_MAP.get(co.getColumnType())) {
                String packageTemp = ColumnTypeToJTypeTool.COMMON_PACKAGE_RE_MAP.get(co.getColumnType());
                if (!commonPackage.contains(packageTemp)) {
                    commonPackage.add(packageTemp);
                }
            }

            List<String> specStr = c.getColumnSpecStrings();
            int i = 0;
            if (null != specStr) {
                while (i < specStr.size()) {
                    String s = specStr.get(i);
                    if ("COMMENT".equalsIgnoreCase(s)) {
                        co.setEntityCommont(specStr.get(i + 1));
                        co.setColumnCommont(co.getEntityCommont().replace("'", ""));
                    }
                    i++;
                }
            }
            columnResult.add(co);
        }
        dto.setCommonPackage(commonPackage);
        dto.setColumns(columnResult);
        return dto;
    }

    public static void main(String args[]) throws JSQLParserException {
        String sql1 = "SELECT     column_name,    column_comment,    COLUMN_TYPE,    COLUMN_DEFAULT FROM     Information_schema.columns WHERE   table_Name = 'TB_ACCOUNT_LOAN_CANCEL'";
        String sql2 = "select userid,username,password " + "from sys_user where username = 'isea533'";
        String sql3 = "CREATE TABLE ADVERTFILE (ID bigint NOT NULL AUTO_INCREMENT, ADVERT_CODE varchar(64) COMMENT '文件编号', STATUS varchar(12) COMMENT '模板状态', IS_SHOW varchar(2) COMMENT '是否首页展示 0-展示，1-不展示', CREATER varchar(64) COMMENT '上传人', CREATE_TIME timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '上传时间', ADVERT_NAME varchar(128) COMMENT '文件名称', UPLOAD_FILE_ADDS varchar(512) COMMENT '文件存放服务器地址', SOURCE_FILE_NAME varchar(256) COMMENT '源文件名', TARGET_ADDS varchar(512) COMMENT '跳转路径', ADVERT_REMARK varchar(128) COMMENT '备注', ADVERT_IS_NEW varchar(2) COMMENT '新用户还是老用户 0-新用户， 1-老用户， 2-所有用户', UPDATE_TIME timestamp DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间', START_TIME timestamp DEFAULT '0000-00-00 00:00:00' COMMENT '生效时间', END_TIME timestamp DEFAULT '0000-00-00 00:00:00' COMMENT '失效时间', MODULE_CODE varchar(128) COMMENT '模块编码', POSITION_CODE varchar(128) COMMENT '位置编码', SHOW_ORDER varchar(8) COMMENT '排序', PRIMARY KEY (ID)) ENGINE=InnoDB DEFAULT CHARSET=utf8";

        String sql4 = "CREATE TABLE TB_CUSTOMER_OA_INFO ( id bigint(20) NOT NULL auto_increment, EMPLOYEE_ID VARCHAR(40) DEFAULT NULL COMMENT '员工编码', EMPLOYEE_NAME VARCHAR(80) DEFAULT NULL COMMENT '员工姓名', MOBILE_NUM VARCHAR(40) DEFAULT NULL COMMENT '手机号', EMPLOYEE_CARDNUM VARCHAR(80) DEFAULT NULL COMMENT '员工卡号', JOB_LEVEL VARCHAR(40) DEFAULT NULL COMMENT '行政级别', EMPLOYEE_SYSTEM_CODE VARCHAR(20) DEFAULT NULL COMMENT '体系编码', KIND_CODE VARCHAR(40) DEFAULT NULL COMMENT '品类编码', KIND_NAME VARCHAR(200) DEFAULT NULL COMMENT '品类名称', GENDER VARCHAR(10) DEFAULT NULL COMMENT '性别', BIRTHDAY VARCHAR(40) DEFAULT NULL COMMENT '出生日期', POST_ADDRESS VARCHAR(200) DEFAULT NULL COMMENT '通讯地址', POST_CODE VARCHAR(20) DEFAULT NULL COMMENT '邮编', EMAIL VARCHAR(200) DEFAULT NULL COMMENT '邮箱', PHONE_NUM VARCHAR(100) DEFAULT NULL COMMENT '单位电话', BRAND_CODE VARCHAR(20) DEFAULT NULL COMMENT '品牌编码', BRAND_NAME VARCHAR(200) DEFAULT NULL, GROUP_CODE VARCHAR(20) DEFAULT NULL COMMENT '员工组编码', GROUP_NAME VARCHAR(200) DEFAULT NULL COMMENT '员工组名称', SUBGROUP_CODE VARCHAR(20) DEFAULT NULL COMMENT '员工子组编码', SUBGROUP_NAME VARCHAR(100) DEFAULT NULL COMMENT '员工子组名称', HRAREA_CODE VARCHAR(20) DEFAULT NULL COMMENT '人事范围编码', HRAREA_NAME VARCHAR(200) DEFAULT NULL COMMENT '人事范围名称', HRSUBAREA_CODE VARCHAR(20) DEFAULT NULL COMMENT '人事子范围编码', HRSUBAREA_NAME VARCHAR(200) DEFAULT NULL COMMENT '人事子范围名称', SALARYCHECK_CODE VARCHAR(20) DEFAULT NULL COMMENT '工资核算范围编码', SALARYCHECK_NAME VARCHAR(200) DEFAULT NULL COMMENT '工资核算范围名称', EMPLOYEE_STATUS VARCHAR(20) DEFAULT NULL COMMENT '员工状态', EMPLOYEE_STATUS_DESC VARCHAR(200) DEFAULT NULL COMMENT '员工状态描述', ORGFINANCIAL_CODE VARCHAR(20) DEFAULT NULL COMMENT '人员所属', ORGFINANCIAL_NAME VARCHAR(200) DEFAULT NULL COMMENT '人员所属公司名称（财务）', ITCODE VARCHAR(20) DEFAULT NULL COMMENT '英文名', PREFERCONTACTMETHOD VARCHAR(200) DEFAULT NULL, ID_CARD VARCHAR(50) DEFAULT NULL COMMENT '身份证号', HIGHESTEDU_CODE VARCHAR(20) DEFAULT NULL COMMENT '最高学历编码', HIGHESTEDU VARCHAR(50) DEFAULT NULL COMMENT '最好学历', SALARYPAYMETHOD VARCHAR(20) DEFAULT NULL COMMENT '工资收付方式编码', BANK_LOCATION VARCHAR(200) DEFAULT NULL COMMENT '银行所在城市', BANKCODE VARCHAR(50) DEFAULT NULL COMMENT '银行编码', BANKACCOUNT VARCHAR(50) DEFAULT NULL COMMENT '银行账号', HOUSEFUNDING_ACCOUNT VARCHAR(50) DEFAULT NULL COMMENT '住房公积金账号', HOUSEFUNDINGPAYMETHOD VARCHAR(10) DEFAULT NULL COMMENT '住房公积金支付方式', ORG_ID VARCHAR(10) DEFAULT NULL COMMENT '员工所属组织编码', ORG_NAME VARCHAR(128) DEFAULT NULL COMMENT '员工所属组织名称', LONGPOSITION_ID VARCHAR(64) DEFAULT NULL COMMENT '职位', LONGPOSITION_NAME VARCHAR(512) DEFAULT NULL COMMENT '职位名称', CITY VARCHAR(128) DEFAULT NULL COMMENT '人员所属城市', OPERATION_TYPE VARCHAR(10) DEFAULT NULL COMMENT '职位', PROFESSION_LEVEL VARCHAR(64) DEFAULT NULL COMMENT '专业级别', KINDREMARK VARCHAR(64) DEFAULT NULL, IDENTITY VARCHAR(126) DEFAULT NULL COMMENT '个人身份编码', PROFESSION_LEVEL_DESC VARCHAR(512) DEFAULT NULL COMMENT '职称', GROUPING VARCHAR(128) DEFAULT NULL COMMENT '分组', GROUPING_DESC VARCHAR(512) DEFAULT NULL COMMENT '专业级别文本描述', KINDREMARK_DESC VARCHAR(512) DEFAULT NULL, IDENTITY_DESC VARCHAR(512) DEFAULT NULL COMMENT '个人身份文本描述', SECONDARY_BANK_CODE VARCHAR(64) DEFAULT NULL COMMENT '第二银行编码', SECONDARY_BANK_ACCOUNT VARCHAR(50) DEFAULT NULL COMMENT '第二银行账户', SECONDARY_BANK_LOCATION VARCHAR(200) DEFAULT NULL COMMENT '第二银行所在城市', SECONDARY_SALARY_PAYMETHOD VARCHAR(20) DEFAULT NULL COMMENT '第二工资收付方式编码', COSTCENTER_CODE VARCHAR(100) DEFAULT NULL COMMENT '成本中心编码', EMPLOYEE_SYSTEM_NAME VARCHAR(200) DEFAULT NULL COMMENT '员工所属体系名称', NATIONALITY_CODE VARCHAR(40) DEFAULT NULL COMMENT '国籍code', NATIONALITY_NAME VARCHAR(200) DEFAULT NULL COMMENT '国际名称', MARRIAGE_STATUS_CODE VARCHAR(5) DEFAULT NULL COMMENT '婚姻状况编码', MARRIAGE_STATUS_NAME VARCHAR(10) DEFAULT NULL COMMENT '婚姻状况名称', CLAN_CODE VARCHAR(10) DEFAULT NULL COMMENT '民族编码', CLAN_NAME VARCHAR(10) DEFAULT NULL COMMENT '民族名称', HIRE_TIME VARCHAR(20) DEFAULT NULL COMMENT '雇佣时间', CONTRACT_TYPE VARCHAR(10) DEFAULT NULL COMMENT '合同类型', CONTRACT_TYPE_DESC VARCHAR(50) DEFAULT NULL COMMENT '合同类型描述', CONTRACT_BEGIN_DATE DATETIME DEFAULT NULL COMMENT '雇佣开始时间', CONTRACT_END_DATE DATETIME DEFAULT NULL COMMENT '雇佣结束时间', NATIVEPLACE VARCHAR(200) DEFAULT NULL COMMENT '故乡', COMPANY_CELLPHONE VARCHAR(20) DEFAULT NULL COMMENT '公司号码', PERSONAL_CELLPHONE VARCHAR(20) DEFAULT NULL COMMENT '私人号码', TRANSFERREDHRAREACODE VARCHAR(100) DEFAULT NULL, TRANSFERREDHRSUBAREACODE VARCHAR(100) DEFAULT NULL, B2CACCOUNT VARCHAR(100) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8 COMMENT= '客户oa'";

        TableDto dto = SqlParserTools.parserCreateTable(sql3);

        System.out.println(dto.toString());
        System.out.println("say google ");
    }
}
